package com.cps.platform.core.json;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonNode;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

import com.cps.platform.core.Mapbean;

/**
 * <p>
 * 文件名称: JsonParserUtil.java
 * </p>
 * <p>
 * 文件描述: JSON与对象转换工具
 * <p>
 * 版权所有: 版权所有(C)2011
 * </p>
 * <p>
 * 公 司: 联通系统集成有限公司
 * </p>
 * <p>
 * 完成日期：2012-12-4
 * </p>
 * 
 * @author ChenZhang
 */
public class JsonParserUtil {

	private static Logger log = Logger.getLogger(JsonParserUtil.class);
	private static ObjectMapper mapper = null;

	static {
		init();
	}

	private static void init() {
		mapper = new ObjectMapper();
	}

	/**
	 * 将Object对象转换为JSON字符串
	 * 
	 * @param putList
	 * @return
	 */
	public static String getJsonFromObject(Object value) {
		try {
			return mapper.writeValueAsString(value);
		} catch (JsonGenerationException e) {
			log.error(e.getMessage());
		} catch (JsonMappingException e) {
			log.error(e.getMessage());
		} catch (IOException e) {
			log.error(e.getMessage());
		}
		return null;
	}

	/**
	 * 将输入的JSON字符串转换为List对象<br/>
	 * 
	 * <p>List中的对象类型为clsT的类型。</p>
	 * @param in
	 * @param clsT
	 * @return
	 * @throws IOException
	 */
	public static <T> List<T> getObjectsFromJson(String in, Class<T> clsT) {
		try {
			JsonParser parser = mapper.getJsonFactory().createJsonParser(in);
			JsonNode nodes = parser.readValueAsTree();
			List<T> list = new ArrayList<T>(nodes.size());
			for (JsonNode node : nodes) {
				list.add(mapper.readValue(node, clsT));
			}
			return list;
		} catch (IOException e) {
			log.error(e.getMessage());
			return null;
		}
	}
	
	/**
	 * 将输入的JSON字符串转换为clsT类型的对象
	 * 
	 * @param in
	 * @param clsT
	 * @return
	 */
	public static <T> Object getObjectFromJson(String in, Class<T> clsT) {
		try {
			return mapper.readValue(in, clsT);
		} catch (IOException e) {
			log.error(e.getMessage());
			return null;
		}
	}
	
	/**
	 * 返回操作信息
	 * @param message 
	 * @return JSON格式的
	 */
	public static String returnMessage(String message){
		return "{m:\""+message+"\"}";
	}
	
	/**
	 * 返回操作信息
	 * @param message 
	 * @return JSON格式的
	 */
	public static String returnMessage(String message, String exception){
		return "{m:\""+message+"\", e:\""+exception+"\"}";
	}
	
	/**
	 * 将MA格式的JSON数据转换为Mapbean对象,
	 * @param mapJson 仅是map格式，不能直接转换为Mapbean，因此
	 * @return
	 */
	public static Mapbean getMapbean(String mapJson) {
		StringBuffer buffer = new StringBuffer();
		buffer.append("{\"map\":").append(mapJson).append("}");
		return (Mapbean) JsonParserUtil.getObjectFromJson(buffer.toString(), Mapbean.class);
	}

}
